package com.mr.orderclient.controller;

import com.mr.orderclient.api.ProductForOrderApi;
import com.mr.orderclient.entity.ProductInfo;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.List;

/**
 * Class: HystrixController
 * User (作者):MRui
 * TODO (描述)：Hystrix 服务保护措施服务降级,熔断机制等
 * * Date 2018-11-17 23:44
 */
@RestController
//全局的hystrix注解，当@HystrixCommand不指定触发方法时，使用此指定的默认方法
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

    @Autowired
    private ProductForOrderApi productForOrderApi;


    //出故障调用的方法
    //@HystrixCommand(fallbackMethod = "fallback")
    //*****以下可加入配置文件bootstrap.yml中
    //修改超时时间，默认为1秒
    /*@HystrixCommand(commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })*/
    //熔断机制
    /*@HystrixCommand(commandProperties = {
            //设置熔断开关
            @HystrixProperty(name="circuitBreaker.enabled",value = "true"),
            //在时间窗口中最小请求数
            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),
            //休眠时间窗10秒钟
            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
            //断路器打开的触发的百分比条件（此处为60%，错误率为60%时打开断路器）
            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60")
    })*/
    //采用配置文件的方式bootstrap.yml配置熔断器
    @HystrixCommand
    @GetMapping("/findList")//采用restTemplate做服务之间通信
    public String getProductInfoListToRestTemplate(@RequestParam("num") Integer num){
        if (num % 2 == 0){
            return "seccess";
        }

        RestTemplate restTemplate = new RestTemplate();
        //调用的url
        String object = restTemplate.postForObject("http://192.168.56.1:8080/product/findListForHystrix"
                //传入的参数
                , Arrays.asList("84b8a0bec5774ce18c01a9a53c5e5de8")
                //返回类型
                , String.class);
        return object;
    }

    @GetMapping("/findListFeign")//采用feign做服务之间通信
    public List<ProductInfo> getProductInfoListToFeign(@RequestParam("num") Integer num){
        if (num % 2 == 0){
            return null;
        }
        List<ProductInfo> list = productForOrderApi.findListForHystrix(Arrays.asList("84b8a0bec5774ce18c01a9a53c5e5de8"));

        return list;
    }
    /**
    * User (作者): MRui
    * TODO (描述)：hystrix 调用方法（出现故障用到hystrix是调用的方法）
    * Data：2018-11-18 17:24
    */
    private String fallback(){

        return "天哪，太拥挤了，稍后再试!!!";
    }
    /**
    * User (作者): MRui
    * TODO (描述)：使用DefaultProperties配合HystrixCommand实现，HystrixCommand不指定则使用此方法
    * Data：2018-11-18 17:33
    */
    private String defaultFallback(){

        return "太拥挤了，稍后再试!!!";
    }
}
